22. private for Data Member

public & protected
data member를 public으로 선언해 주면,
모두가 해당 멤버에 대하여 읽기 및 쓰기 접근 권한을 가지게 된다.
하지만, data member를 private으로 구현하고, 이를 제어하는 메서드(멤버 함수)를 public으로 구현시,
해당 값에 대한 접근불가, 읽기 전용, 읽기 쓰기 접근 등을 사용자가 제어할 수 있게 만들 수 있다.
class AccessLevels{
public:
// ... X
int getReadOnly(void) const { return readOnly; } //
void setReadWrite(int value) { readWrite=value; } //
int getReadWrite(void) const { return readWrtie; } //
void setWrtieOnly(int value){ writeOnly=value; } //
private:
int noAccess; //
int readOnly; //
int readWrite; //
int writeOnly; //
};
캡슐화(Encapsulation)
함수를 통해서만 멤버에 접근 할수 있도록 구현할 경우,
데이터 멤버를 계산식으로 대체할 수 있으며, 사용자가 임의로 접근하는 것을 제한할 수 있다.
class SpeedDataCollection{
// ...
public:
void addValue(int speed);
double averageSoFar(void) const;
// ...
};
또한 이와같은 캡슐화는 구현상의 융통성을 제공할 수 있다.
데이터 멤버를 읽거나 쓸 때, 다른 객체에 알림 메세지를 보낸다거나,
클래스의 불변속성 및 사전조건(precondition), 사후조건(postcondition)을 검증한다거나,
스레딩 환경에서 동기화 제어등을 할 수 있다.

public이나 protected로 선언된 멤버들을 수정해야 하는 경우,
이와 연관된 멤버와 파생 클래스의 멤버들을 모두 변경해야 하는 등, 많은 복잡성을 야기한다.

private은 캡슐화를 제공하기 때문에 이에 대하여 훨씬 안정적이다.